作用域与作用域链

什么叫作用域？
就是变量和函数能作用的范围

什么是作用域链？
当查找变量的时候，会先从当前作用域的变量对象中查找，如果没有找到，就会从父级作用域的变量对象中查找
一直找到全局作用域的变量对象，这样由多个作用域的变量对象构成的链表叫做作用域链

<script>
    //在非匿名自执行函数中，函数变量为只读状态无法修改
    var b = 10;
    (function b() {
        //内部作用域，会先去查找是否已有变量b的声明，有就直接赋值20，确实有了，发现了具名函数b，拿此b赋值
        //由于IIFE自调用函数的机制，无法给他赋值，所以无效
        b = 20;
        console.log(b);//b函数
    })();
    console.log(b)//10
</script>

<script>
    function fn(){
        console.log(fn)//打印的就是fn函数
    }
    fn()
</script>

<script>
    var a=1
    function fn(){
        a=2
        var a
    }
    fn()
    console.log(a)//1
    //当在查找变量的时候，会先从当前作用域的变量对象中查找，如果没有找到，就会从父级作用域的变量对象中查找
    //所以这个地方，在函数内部是否定义了a，决定了打印a的值是几，还考了一个变量提升的概念
</script>